package Donnees;

import Metier.Objets.HeurePointe;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.util.Date;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.TimeZone;

public class DaoHDP {
    
    private Connection connection;
    private PreparedStatement preparedStatement;
    private Statement statement;
    
    /**
     * Renvoie toutes les heures de pointes sous forme de liste
     * @return la liste des heures de pointes
     * @throws SQLException 
     */
    public List<HeurePointe> rechercher() throws SQLException {
        String query = "SELECT * FROM HEURE_POINTE";  
        ResultSet rs = null;
        List<HeurePointe> list = new ArrayList<>();
        try {
            connection = ConnectionFactory.getConnection();
            statement = connection.createStatement();
            rs = statement.executeQuery(query);
            while (rs.next()) {    
                list.add(new HeurePointe(
                            rs.getInt("id"), 
                            rs.getTimestamp("heure_debut"),
                            rs.getTimestamp("heure_fin")
                        ));
            }
        } finally {
            DbUtil.close(rs);
            DbUtil.close(statement);
            DbUtil.close(connection);
        }
        return list;
    }
    
    /**
     * Supprime une plage d'heures de pointe en base de données
     * @param idHDP  identifiant des heures de pointe à supprimer
     * @throws SQLException 
     */
    public void supprimer(int idHDP) throws SQLException{
        //TODO : Revoir pour les exceptions
        
        try {
            String query = "DELETE FROM HEURE_POINTE where id=" + idHDP;
            connection = ConnectionFactory.getConnection();
            statement = connection.createStatement();
            statement.execute(query);
        } finally {
            DbUtil.close(statement);
            DbUtil.close(connection);
        }
    }
    
    /**
     * Ajouter des heures de pointes en base de données
     * @param heurePointe  heures de pointe à ajouter
     * @throws SQLException 
     * @throws java.text.ParseException 
     */
    public void ajouter(HeurePointe heurePointe) throws SQLException, ParseException{

        try{
            //Récupération de la connexion
            connection = ConnectionFactory.getConnection();
            
            //Déclaration de la requête
            String query = "INSERT INTO HEURE_POINTE (heure_debut, heure_fin) VALUES (?, ?)";

            //Formattage des heures de pointe en GMT pour pouvoir les enregistrer en base de données
            SimpleDateFormat dateFormat = new SimpleDateFormat();  
            dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
            Date dateDebut = heurePointe.getHeureDebut().getTime();
            Date dateFin = heurePointe.getHeureFin().getTime();
            dateDebut = dateFormat.parse(dateFormat.format(dateDebut));
            dateFin = dateFormat.parse(dateFormat.format(dateFin));

            //Préparation de la requête
            preparedStatement = connection.prepareStatement(query);
            preparedStatement.setTimestamp(1, new Timestamp(dateDebut.getTime()));
            preparedStatement.setTimestamp(2, new Timestamp(dateFin.getTime()));
            
            //Exécution de la requête
            preparedStatement.executeUpdate();
        }
        finally{
            preparedStatement.close();
            DbUtil.close(connection);
        }
        
    }
}
